Ekplorasi Spotify Top Chart
Lagu Tahun 1970 - 2020
Updated: 2022-01-27
Pengenalan
Apa itu Spotify?
Spotify merupakan layanan musik digital yang dapat memberikan kita jutaan lagu dari kreator di seluruh dunia. Spotify memudahkan dalam menemukan musik sesuai dengan preferensi penggunanya. Saat ini, terdapat jutaan lagu yang dapat didengar dari beberapa perangkat seperti ponsel, komputer, tablet, dll.
Spotify Top Chart
Setiap tahunnya, spotify memberikan daftar lagu-lagu yang termasuk kedalam kategori populer (top chart). Pada kali ini, kita akan mencoba mengeksplorasi bagaimana pola dari lagu-lagu yang dapat masuk ke dalam kategori top chart.
Dataset
Dataset yang digunakan berisikan lagu-lagu dari tahun 1970 hingga 2021 yang pernah memasuki top chart spotify. Berikut ini adalah informasi mengenai feature yang ada pada dataset:
titleartistgenrebpmnrgydncedBlivevalduracousspchpopularityhas_win_award
Import Data dan Package
# Library yang akan digunakan
library(tidyverse)
library(readr)
library(ggplot2)
library(plotly)spotify <- read.csv("datasets/spotify.csv")Data Preparation
Inspeksi Data
Kita akan melihat bagaimana struktur dari data, dimensi data, serta tipe data yang digunakan. Hal ini akan sangat membantu kita dalam melakukan data preparation sebelum data digunakan dalam pemodelan machine learning.
# Inspeksi Struktur dan tipe data
glimpse(spotify)## Rows: 1,270
## Columns: 16
## $ X <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
## $ title <chr> "Love The Way You Lie", "TiK ToK", "Bad Romance", "Just …
## $ artist <chr> "Eminem", "Kesha", "Lady Gaga", "Bruno Mars", "Justin Bi…
## $ genre <chr> "detroit hip hop", "dance pop", "dance pop", "pop", "can…
## $ year <int> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 20…
## $ bpm <int> 87, 120, 119, 109, 65, 120, 148, 93, 126, 128, 145, 130,…
## $ nrgy <int> 93, 84, 92, 84, 86, 78, 76, 37, 72, 87, 83, 82, 83, 84, …
## $ dnce <int> 75, 76, 70, 64, 73, 75, 52, 48, 79, 62, 62, 77, 83, 44, …
## $ dB <int> -5, -3, -4, -5, -5, -4, -6, -8, -4, -4, -5, -5, -6, -8, …
## $ live <int> 52, 29, 8, 9, 11, 4, 12, 12, 7, 6, 10, 70, 11, 12, 36, 1…
## $ val <int> 64, 71, 71, 43, 54, 82, 38, 14, 61, 47, 48, 63, 71, 78, …
## $ dur <int> 263, 200, 295, 221, 214, 203, 225, 216, 235, 235, 230, 2…
## $ acous <int> 24, 10, 0, 2, 4, 0, 7, 74, 13, 3, 33, 18, 1, 1, 20, 5, 7…
## $ spch <int> 23, 14, 4, 4, 14, 9, 4, 3, 4, 3, 4, 5, 4, 45, 3, 3, 7, 5…
## $ popularity <int> 82, 80, 79, 78, 77, 77, 77, 76, 73, 73, 73, 73, 73, 72, …
## $ has_win_award <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
Pengecekan Tipe Data
# Melihat jumlah unique value setiap kolom
spotify %>%
summarise_each(funs = n_distinct)## X title artist genre year bpm nrgy dnce dB live val dur acous spch
## 1 602 1192 589 137 66 126 96 79 23 76 96 234 99 45
## popularity has_win_award
## 1 76 2
Dari informasi diatas, kita akan mengubah tipe data dari genre menjadi factor. Kita juga akan menghapus kolom X dikarenakan kolom ini merupakan kolom tambahan hasil merge dari beberapa dataset yang telah saya lakukan sebelumnya. Selain itu, kita juga akan mengubah tipe data dari has_win_award menjadi integer (diskret).
spotify <- spotify %>%
select(-X) %>%
mutate(genre = as.factor(genre), has_win_award = as.integer(has_win_award))
str(spotify)## 'data.frame': 1270 obs. of 15 variables:
## $ title : chr "Love The Way You Lie" "TiK ToK" "Bad Romance" "Just the Way You Are" ...
## $ artist : chr "Eminem" "Kesha" "Lady Gaga" "Bruno Mars" ...
## $ genre : Factor w/ 137 levels "","acoustic blues",..: 82 77 77 131 57 77 77 111 25 77 ...
## $ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ bpm : int 87 120 119 109 65 120 148 93 126 128 ...
## $ nrgy : int 93 84 92 84 86 78 76 37 72 87 ...
## $ dnce : int 75 76 70 64 73 75 52 48 79 62 ...
## $ dB : int -5 -3 -4 -5 -5 -4 -6 -8 -4 -4 ...
## $ live : int 52 29 8 9 11 4 12 12 7 6 ...
## $ val : int 64 71 71 43 54 82 38 14 61 47 ...
## $ dur : int 263 200 295 221 214 203 225 216 235 235 ...
## $ acous : int 24 10 0 2 4 0 7 74 13 3 ...
## $ spch : int 23 14 4 4 14 9 4 3 4 3 ...
## $ popularity : int 82 80 79 78 77 77 77 76 73 73 ...
## $ has_win_award: int 1 0 0 0 0 0 0 0 0 0 ...
Penanganan Missing Value
Missing value merupakan kondisi yang harus ditangani sebelum nantinya data digunakan untuk pemodelan. Alasan mengapa missing value perlu ditangani dikarenakan hal tersebut dapat mengurangi akurasi dari model machine learning.
spotify %>%
is.na() %>%
colSums()## title artist genre year bpm
## 0 0 0 0 0
## nrgy dnce dB live val
## 0 0 0 0 0
## dur acous spch popularity has_win_award
## 0 0 0 0 0
Berdasarkan hasil diatas, dataset kita saat ini tidak memiliki missing value.
Penanganan Data Duplikat
spotify %>%
distinct() %>%
dim()## [1] 1265 15
Awalnya kita memiliki dataset dengan dimensi (1270, 15) dan setelah fungsi distinct() dijalankan dimensi dari dataset menjadi (1265, 15). Berarti, sebelumnya terdapat 5 baris yang teridentifikasi sebagai data duplikat. Kita akan menghapus semua baris yang teridentifikasi sebagai data duplikat.
spotify <- spotify %>%
distinct()Exploratory Data Analysis
Korelasi Fitur Numerik
library(GGally)## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
spotify %>%
select_if(is.numeric) %>%
select(-has_win_award) %>%
ggcorr(label=T)Siapa Artis Paling Populer?
popular_artist <- spotify %>%
group_by(artist) %>%
summarise(n_popular_song = n(), .groups = "drop") %>%
arrange(desc(n_popular_song)) %>%
head(15)library(ggthemes)
library(glue)
popular_artist_plot <- popular_artist %>%
ggplot(aes(x = n_popular_song,
y = reorder(artist, n_popular_song),
text = glue("Jumlah lagu populer: {n_popular_song}"))) +
geom_segment( aes(x = 0, xend=n_popular_song, yend = artist), color="skyblue") +
geom_point( color="orange", size=2.5, alpha=0.6) +
theme_clean() +
theme(
panel.grid.major.y = element_blank(),
panel.border = element_blank(),
axis.ticks.y = element_blank()
) +
labs(
title = "Artist dengan Jumlah Lagu Populer Terbanyak",
subtitle = "Tahun 1960an - 2020an",
x = "Jumlah Lagu Populer",
y = "Artist"
)ggplotly(popular_artist_plot, tooltip = "text")Genre Lagu Apa yang Terkenal Pada Era Tertentu?
Feature Engineering
convert_year <- function(year) {
if(year >= 2020) {
year <- "2020an"
} else if (year >= 2010) {
year <- "2010an"
} else if (year >= 2000) {
year <- "2000an"
} else if (year >= 1990) {
year <- "1990an"
} else if (year >= 1980) {
year <- "1980an"
} else if (year >= 1970) {
year <- "1970an"
} else if (year >= 1960) {
year <- "1960an"
} else {
year <- "Sebelum 1960"
}
}# Membuat kolom baru 'era'
spotify$era <- sapply(X = spotify$year,
FUN = convert_year)
spotify$era <- as.factor(spotify$era)popular_genre <- spotify %>%
group_by(era, genre) %>%
summarise(mean_popularity = mean(popularity), .groups = "drop") %>%
ungroup() %>%
arrange(desc(mean_popularity))popular_genre[match(unique(popular_genre$era), popular_genre$era), ]## # A tibble: 7 × 3
## era genre mean_popularity
## <fct> <fct> <dbl>
## 1 2010an escape room 90
## 2 2000an permanent wave 82
## 3 1980an glam metal 81.5
## 4 1990an atl hip hop 79
## 5 1970an british folk 74
## 6 1960an baroque pop 71
## 7 Sebelum 1960 adult standards 49.1